昨天講完 NoSQL
的概念並且將 MongoDB
安裝完成,今天就讓我們使用 golang 來存取 MongoDB
吧!
mgo
是一款好用的 MongoDB Driver
,他將許多方法進行封裝讓使用者可以更快速地上手,
透過 go get
的方式進行安裝
go get gopkg.in/mgo.v2
在一切開始之前,我們先透過 Dial
方法連線至 MongoDB
session, err := mgo.Dial("127.0.0.1:27017")
if err != nil {
panic(err)
}
如果有設定帳號密碼驗證,新增一個 Credential
後,透過 Login
方法進行登入
cred := &mgo.Credential{
Username: username,
Password: password,
}
err := session.Login(cred)
if err != nil {
panic(err)
}
今天以 登入紀錄
為範例,因此我們資料庫選擇為 user
,而 Collection 選擇使用 user.info
,以下透過 mgo 進行
db := session.DB("user")
c := db.C("login.info")
假設今天我們要存放的是登入的資訊,我們可以設計一個 struct
如下,分別紀錄使用者id、ip、登入狀態與登入時間
type LoginInfo struct {
UserID int64 `json:"userId"`
ClientIP string `json:"clientIP"`
LoginState string `json:"loginState"`
LoginTime time.Time `json:"loginTime"`
}
我們設計一個方法快速的建立 LoginInfo
的 instance 如下
func NewLoginInfo(id int64, clientIP string, loginState string) *LoginInfo{
return &LoginInfo{
UserID: id,
ClientIP: clientIP,
LoginState: loginState,
LoginTime: time.Now(),
}
}
透過 Insert
方法可以直接將 document
新增至 MongoDB 中如下
err = c.Insert(NewLoginInfo(1234, "127.0.0.1", "success"))
if err != nil {
panic(err)
}
目前整體程式如下
package main
import (
"fmt"
"gopkg.in/mgo.v2"
"gopkg.in/mgo.v2/bson"
"time"
)
type LoginInfo struct {
UserID int64 `json:"userId"`
ClientIP string `json:"clientIP"`
LoginState string `json:"loginState"`
LoginTime time.Time `json:"loginTime"`
}
func main() {
session, err := mgo.Dial("127.0.0.1:27017")
if err != nil {
panic(err)
}
db := session.DB("user")
c := db.C("login.info")
err = c.Insert(NewLoginInfo(1234, "127.0.0.1", "success"))
if err != nil {
panic(err)
}
}
func NewLoginInfo(id int64, clientIP string, loginState string) *LoginInfo{
return &LoginInfo{
UserID: id,
ClientIP: clientIP,
LoginState: loginState,
LoginTime: time.Now(),
}
}
將程式執行完畢後,可以透過昨天提到的 compass
來查看 MongoDB 內的資料,如果查詢 user
內的 login.info
可以查訊到相關資料代表程式執行成功
查詢的部分就更簡單拉,可以透過 Find
方法進行查詢後,透過 All
方法將結果 mapping 到物件內,以下為查詢 userid
為 1234
的範例
var loginHistory []LoginInfo
err = c.Find(bson.M{"userid": 1234}).All(&loginHistory)
if err != nil {
panic(err)
}
for _, history := range loginHistory {
fmt.Println(history)
}
在查詢登入紀錄時,可能會有 查詢最後一次登入
的需求出現,這時我們就可以使用 Sort
來排序我們想要排序的欄位,欄位名稱前面加入 -
代表倒序
,最後使用 One
方法抓取一筆資料,以下為範例
var lastLogin LoginInfo
err = c.Find(bson.M{"userid": 1234}).Sort("-logintime").One(&lastLogin)
if err != nil {
panic(err)
}
fmt.Println(lastLogin)
今天的範例程式全部如下
package main
import (
"fmt"
"gopkg.in/mgo.v2"
"gopkg.in/mgo.v2/bson"
"time"
)
type LoginInfo struct {
UserID int64 `json:"userId"`
ClientIP string `json:"clientIP"`
LoginState string `json:"loginState"`
LoginTime time.Time `json:"loginTime"`
}
func main() {
session, err := mgo.Dial("127.0.0.1:27017")
if err != nil {
panic(err)
}
db := session.DB("user")
c := db.C("login.info")
err = c.Insert(NewLoginInfo(1234, "127.0.0.1", "success"))
if err != nil {
panic(err)
}
var loginHistory []LoginInfo
err = c.Find(bson.M{"userid": 1234}).All(&loginHistory)
for _, history := range loginHistory {
fmt.Println(history)
}
fmt.Println("==========================")
var lastLogin LoginInfo
err = c.Find(bson.M{"userid": 1234}).Sort("-logintime").One(&lastLogin)
if err != nil {
panic(err)
}
fmt.Println(lastLogin)
}
func NewLoginInfo(id int64, clientIP string, loginState string) *LoginInfo{
return &LoginInfo{
UserID: id,
ClientIP: clientIP,
LoginState: loginState,
LoginTime: time.Now(),
}
}
多跑幾次,結果如果沒有爆出錯誤就代表執行成功拉!
{1234 127.0.0.1 success 2020-09-17 22:59:15.593 +0800 CST}
{1234 127.0.0.1 success 2020-09-17 22:59:49.278 +0800 CST}
{1234 127.0.0.1 success 2020-09-17 22:59:51.175 +0800 CST}
{1234 127.0.0.1 success 2020-09-17 23:02:32.815 +0800 CST}
{1234 127.0.0.1 success 2020-09-17 23:02:50.345 +0800 CST}
==========================
{1234 127.0.0.1 success 2020-09-17 23:02:50.345 +0800 CST}
最近剛好有專案需要用到 MongoDB,因此就使用 mgo
這個 package 來實作,希望可以幫到需要的朋友!
你好,我一直出現 panic: no reachable servers 、exit status 2 的字樣,然後連不上 mongodb,請問可以怎麼解決?